/*
题目: 最佳买卖股票时机含冷冻期
给定一个整数数组prices，其中第  prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:

    卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。

注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/
 */
public class MaxProfitCool {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int[] none = new int[n]; // 没有股票
        int[] buy = new int[n];  // 有股票
        int[] cool = new int[n]; // 没有股票, 并且冷冻期
        buy[0] = -prices[0];

        for (int i = 1; i < n; i ++) {
            // 没有股票: 由冷冻期转换, 或者本来就没有
            none[i] = Math.max(none[i - 1], cool[i - 1]);
            // 有股票 : 非冰冻期转换, 或者不卖
            buy[i] = Math.max(none[i - 1] - prices[i], buy[i - 1]);
            // 没有股票, 冰冻期 : 购买完股票后 转化而来
            cool[i] = buy[i - 1] + prices[i];
        }

        return Math.max(cool[n - 1], none[n - 1]);
    }
}
